const multer  = require('multer');
const express = require('express');
const router = express.Router();
const axios=require('axios');
const serviceUser=require('../../service/user');
const db=require('../../dbConfig');

// sql注入
// https://blog.csdn.net/suxiongwei/article/details/82178496
// select * from user where username='${username}' and password='${password}'
// 如果单纯的字符串拼接的话会存在sql注入，比如 假设user表中有username叫abc，username是一个变量 当传入  abc' -- 
// sql语句会变会变成如下：
// select * from user where username='abc' -- ' and password='${password}'
// --后面的就会被注释掉。所以只需要知道用户名就可以登录成功
// 还有一些 比如 表名字使用变量的话会出现如下：
// select * from ${tableName} where name = #{name} 
// select * from user; delete from user; -- where name = ?;
// -– 之后的语句将作为注释，不起作用，因此本来的一条查询语句偷偷的包含了一个删除表数据的 SQL！
// node-mysql 解决sql注入 方法如下：
// https://www.cnblogs.com/rysinal/p/8350783.html

// function timestampToTime(timestamp) {
//   let date = new Date(timestamp); //时间戳为10位需*1000，时间戳为13位的话不需乘1000
//   let Y = date.getFullYear() + '-';
//   let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
//   let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
//   let H = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() ;
//   let MI = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() ;
//   let S = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() ;
//   return Y + M + D+'_'+ H + "." + MI + "." + S;
// }

// 用户注册
router.post('/register',async (req,res)=>{
  let result=await serviceUser.register(req.body);
  res.json(result);
})

// 用户登录
.post('/login',async(req,res)=>{
  let result=await serviceUser.login(req.body,req.app.get('secret'));
  res.json(result);
})

// 查询 用户名 || 邮箱 || 手机号是否被使用
.post('/checkInfo',async(req,res)=>{ 
  let result=await serviceUser.checkInfo(req.body);
  res.json(result);
})

// 重置密码
.put('/resetPassword',async function(req,res){ 
  let result=await serviceUser.resetPassword(req.body);
  res.json(result);
})

.get('/oauth',async function(req,res){ 
  let {code} = req.query;
  let githubLogin=await axios.post('https://github.com/login/oauth/access_token',{
    client_id:'1b27cae7edb651dbdc4b',
    client_secret:'d4b8ea025920b8a3aa22b699975813e91cfa45fc',
    code:code
  },{
    headers: {
      'accept': 'application/json'
    }
  }).then(result=>{
    let data=result.data;
    return data;
  }).catch(function (err) {
    console.log(err);
  });
  let userInfo=await axios.get('https://api.github.com/user',{
    headers: {
      Authorization:`token ${githubLogin.access_token}`
    }
  }).then(res=>{
    return res.data;
  })
  let sql=`select id,name,role,email,phone,is_show,avator,FROM_UNIXTIME(UNIX_TIMESTAMP(create_time), '%Y-%m-%d %H:%i:%s') create_time from user where name=?`;
  let result = await db(sql,[userInfo.login]);
  let expireTime =Math.floor(Date.now() / 1000) + (24* 60 * 60);
  const jwt = require('jsonwebtoken');
  const token = jwt.sign({ userId: result[0].id,exp:expireTime},'abcd1xc5646'); 
  if(result.length>0){
    res.json({
      userInfo:result,
      token:token
    })    
  }
  else{
    let userId=randomString(24);
    let username=userInfo.login;
    let avator=userInfo.avatar_url;
    // let createTime=timestampToTime(new Date(userInfo.created_at).getTime());
    let sqlInsert=`insert into user (id,name,avator) values (?,?,?)`;
    let insert = await db(sqlInsert,[userId,username,avator,createTime]);
    let sql=`select id,name,role,email,phone,is_show,avator,FROM_UNIXTIME(UNIX_TIMESTAMP(create_time), '%Y-%m-%d %H:%i:%s') create_time from user where name=?`;
    let result = await db(sql,[username]);
    res.json({
      userInfo:result,
      token:token
    })   
  }
})

// 发送验证码到手机
.post('/sendCodeByPhone',async(req,res)=>{ 
  let result=await serviceUser.sendCodeByPhone(req.body);
  res.json(result);
})

// 发送验证码到邮箱
.post('/sendCodeByEmail', async (req, res) => {
  let result=await serviceUser.sendCodeByEmail(req.body);
  res.json(result);
})

// 检查验证码是否正确
.post('/checkCode',async(req,res)=>{ 
  let result=await serviceUser.checkCode(req.body);
  res.json(result);
})

// 删除验证码
.delete('/deleteCode', async (req, res) => {
  let result=await serviceUser.deleteCode(req.body);
  res.json(result);
})

module.exports=router;